# -*- coding: utf-8 -*-
import traceback
from mod_log import logger
import re
import time
import json5
from legendaryPowerScript.fighters import Stat, Fighter
from mod_log import logger
from legendaryPowerScript._lpcommon.vector import Vector
from legendaryPowerScript.mob.mobSkillTargeter import *
from legendaryPowerScript.spell._spells.spell import Spell, AOESpell, ModifierSet, conditions
import mod.server.extraServerApi as serverApi
from .._lpcommon import vector
class MobType:
    # type: () -> None
    """
    怪物的类型
    Attributes:
        - id (int): 怪物类型的唯一标识符。
        - displayName (str): 怪物类型的显示名称。
        - point (str): 分数。
        - playDeathCloud (bool): 是否播放死亡烟雾。
        - engineType (str): 引擎类型。
        - templateName (str): 模板名称。
        - increaseElite (float): 增加精英刷新率。
        - multiplier (float): 模板倍率。
        - stat (dict[str, Stat]): 属性字典。
        - baseStats (dict[str, Stat]): 基础属性字典。
        - equipments (str): 装备。
        - alwaysAirborne (bool): 是否总是在空中。
        - syncHealth (None或str): 同步生命。
        - regenHealth (bool): 自动回血。
        - preventShoot (bool): 是否阻止射击。
        - autoAttack (bool): 是否自动攻击过近敌人。
        - attackSfx (bool): 是否有攻击特效。
        - suggestion (str): 击杀提示。
        - attackKarmaMinimum (None或str): 主动攻击的最低罪恶值。
        - minions (str): 召唤物。
        - invincible (bool): 是否免疫伤害。
        - invincible2Player (bool): 是否免疫玩家伤害。
        - blockAI (bool): 是否禁用AI。
        - checkLos (bool): 是否检测视线。
        - recordDamageComposition (bool): 是否记录伤害构成。
        - setBarriersAbove (str): 在上方设置屏障。
        - pushable (bool): 是否可推动。
        - icon (None或str): 交互图标。
        - interactText (None或str): 交互文字。
        - spawnAtBlockCenter (bool): 是否生成于方块中央。
        - collisionSize (None或str): 碰撞箱。
        - scale (float): 体型大小。
        - deathDuration (None或str): 死亡动画时间。
        - lookAtNearestPlayer (bool): 是否自动看向附近玩家。
        - lookYawOffset (int): 自动看向偏移。
        - yearMultiplier (float): 年份倍率。
        - skills (dict[str, list[MobSpellLine or MobSpellSection]]): 技能字典。
        - spellNames (str): 魔法名称。
        - isPersistant (bool): 是否持久化。
        - attackSound (str): 攻击音效。
        - hurtSound (str): 受击音效。
        - deathSound (str): 死亡音效。
        - level (int): 等级。
        - model (None或str): 模型。
        - modelTexture (None或str): 模型材质。
        - windup (float): 攻击前摇。
        - winddown (float): 攻击后摇。
        - range (float): 攻击距离。
        - angle (int): 攻击角度。
        - lookAtTaskId (None或str): 自动看向任务ID。
        - walkAnimation (None或str): 行走动画。
        - standAnimation (None或str): 站立动画。
        - attackAnimation (None或str): 攻击动画。
        - freezeWhileAttack (bool): 攻击时是否停止移动。
        - modelAttachments (None或dict): 模型附件。
        - tagHandlers (None或list): 词条处理器列表。
    """
    self.- id  = 0
    self.- displayName  = ""
    self.- point  = ""
    self.- playDeathCloud  = False
    self.- engineType  = ""
    self.- templateName  = ""
    self.- increaseElite  = 0.0
    self.- multiplier  = 0.0
    self.- stat  = ""
    self.- baseStats  = ""
    self.- equipments  = ""
    self.- alwaysAirborne  = False
    self.- syncHealth  = ""
    self.- regenHealth  = False
    self.- preventShoot  = False
    self.- autoAttack  = False
    self.- attackSfx  = False
    self.- suggestion  = ""
    self.- attackKarmaMinimum  = ""
    self.- minions  = ""
    self.- invincible  = False
    self.- invincible2Player  = False
    self.- blockAI  = False
    self.- checkLos  = False
    self.- recordDamageComposition  = False
    self.- setBarriersAbove  = ""
    self.- pushable  = False
    self.- icon  = ""
    self.- interactText  = ""
    self.- spawnAtBlockCenter  = False
    self.- collisionSize  = ""
    self.- scale  = 0.0
    self.- deathDuration  = ""
    self.- lookAtNearestPlayer  = False
    self.- lookYawOffset  = 0
    self.- yearMultiplier  = 0.0
    self.- skills  = ""
    self.- spellNames  = ""
    self.- isPersistant  = False
    self.- attackSound  = ""
    self.- hurtSound  = ""
    self.- deathSound  = ""
    self.- level  = 0
    self.- model  = ""
    self.- modelTexture  = ""
    self.- windup  = 0.0
    self.- winddown  = 0.0
    self.- range  = 0.0
    self.- angle  = 0
    self.- lookAtTaskId  = ""
    self.- walkAnimation  = ""
    self.- standAnimation  = ""
    self.- attackAnimation  = ""
    self.- freezeWhileAttack  = False
    self.- modelAttachments  = {}
    self.- tagHandlers  = []

    def rebuildSpells(self):
        # type: () -> None
        """
        重新构建怪物的技能列表。

        参数：
            - 无

        返回：
            - 无
        """
        pass

    def spawn(self, location, trigger=None, level=None, power=None, rotation=None):
        # type: (Vector, Fighter, float, float) -> ActiveMob
        """
        在给定位置生成怪物实体。

        参数：
            - location (Vector)：生成位置向量。
            - trigger (Fighter, optional)：触发生成怪物的战斗者。
            - level (float, optional)：怪物的等级。
            - power (float, optional)：怪物的战斗力。
            - rotation (tuple, optional)：怪物的旋转角度。

        返回：
            - ActiveMob：生成的怪物实体。
        """
        pass

    def instantiate(self, fighter, trigger=None, level=None, power=None, spawnLoc=None):
        # type: (ActiveMob, None or Fighter, None或int, None或float, None或Location) -> ActiveMob
        """
        初始化怪物实体

        参数：
            - fighter (ActiveMob)：要初始化的怪物实体。
            - trigger (None or Fighter)：怪物的召唤者。
            - level (None或int)：怪物的等级。
            - power (None或float)：怪物的能力值。
            - spawnLoc (None或Location)：怪物生成的位置。

        返回：
            - mob (ActiveMob)：创建的活跃怪物对象。
        """
        return ActiveMob()


class MobSpellSection:
    # type: (str, dict) -> None
    """
    怪物的技能。

    参数：
        - typeName (str)：怪物类型名称
        - section (dict)：怪物技能的配置信息

    属性：
        - typeName (str)：怪物类型名称
        - spell (Spell)：技能对象，表示怪物释放的技能
        - trigger (str)：技能触发时机
        - targeter (Targeter)：目标选取器，用于选择技能的施放目标
        - lifeReq (str)：生命条件，要求怪物满足特定的生命值条件才能释放技能
        - lifeReqAmount (float)：生命条件数值，表示满足生命条件的百分比（0-1）
        - period (int)：技能释放的周期，以游戏ticks为单位
        - activeNotInBattle (bool)：是否在战斗状态下也能释放技能
        - targetCondition (ModifierSet)：目标条件限制，要求技能释放的目标满足一定的条件
        - timer (int)：技能释放的计时器，记录距离下次释放的时间
        - summoner (Summoner)：召唤者对象，表示释放技能的怪物召唤者
        - maxTargets (int)：最大目标数，表示技能影响的最大目标数量
        - delay (float)：技能连续释放的间隔时间
        - ignoreSilenced (bool)：是否忽略被沉默状态，即即使怪物被沉默也能释放技能
        - gazeAtTarget (None)：注视目标，保留字段，暂时未使用
        - index (int)：技能序号，用于区分同时存在多个技能的情况
        - mustOnGround (bool)：是否必须站在地面上才能释放技能
        - range (float)：技能的施放范围
        - spellName (str)：技能名称
        - section (dict)：怪物技能的配置信息
    """
    self.- typeName  = ""
    self.- spell  = Spell()
    self.- trigger  = ""
    self.- targeter  = Targeter()
    self.- lifeReq  = ""
    self.- lifeReqAmount  = 0.0
    self.- period  = 0
    self.- activeNotInBattle  = False
    self.- targetCondition  = ModifierSet()
    self.- timer  = 0
    self.- summoner  = Summoner()
    self.- maxTargets  = 0
    self.- delay  = 0.0
    self.- ignoreSilenced  = False
    self.- index  = 0
    self.- mustOnGround  = False
    self.- range  = 0.0
    self.- spellName  = ""
    self.- section  = {}

    def isHealthQualified(self, mob, nowPercent):
        # type: (Mob, float) -> None
        """
        判断怪物当前的生命百分比是否满足技能释放条件。

        参数：
            - mob (Mob)：怪物对象
            - nowPercent (float)：怪物当前的生命百分比（0-1）

        返回：
            - bool：是否满足生命条件

        """
        pass

    def __repr__(self):
        # type: () -> None
        """
        返回怪物技能的字符串表示。

        返回：
            - str：怪物技能的字符串表示

        """
        pass

class ActiveMob:
    """
    表示游戏中一个活动的生物。
    属性：
        - deleted (bool): 表示生物是否已删除的标志。
        - fighter (Fighter): 与生物相关联的战斗者。
        - spawnLoc (None): 生物的生成位置。
        - barrierBlocks (None): 生物的屏障方块。
        - mobType (MobType): 生物的类型。
        - skills (dict): 与生物相关联的技能字典。
        - previousHealth (int): 生物之前的健康值。
        - dropRate (float): 生物的掉落率。
        - expRate (float): 生物的经验率。
        - title (list): 生物的称号列表。
        - mutations (list): 生物的变异列表。
        - castedSkill (list): 生物释放的技能列表。
        - noAttackSeconds (int): 自上次攻击以来的时间（秒）。
        - lastBattleTime (float): 生物最后一次战斗的时间。
        - lastTickTarget (None): 生物上一次的目标。
        - pastedInstance (set): 生物的复制实例集合。
        - damageComposition (dict): 生物伤害组成的字典。
        - windup (int): 生物的蓄力时间。
        - winddown (int): 生物的冷却时间。
        - riders (list): 生物的乘客列表。
        - initedRide (bool): 表示乘坐是否已初始化的标志。
        - state (int): 生物的状态。0: 静止, 1: 移动, 2: 攻击, 3: 使用技能。
        - attackingTarget (None): 被生物攻击的目标。
        - stateCallback (None): 生物状态更改的回调函数。
        - freezing (int): 生物被冰冻的时间。
        - updateAttackKarmaCountdown (int): 更新攻击因果倒计时。
        - killed (bool): 表示生物是否已被杀死的标志。
        - killLoc (None): 杀死生物的位置。
        - level (None): 生物的等级。
        - rotComp (None): 生物的旋转组件。
        - freezeRot (None): 生物被冰冻后的旋转。
        - actionComp (object): 生物的行动组件。
        - cannotAttackUntil (int): 生物可以再次攻击的时间。
        - registeredSpells (list): 生物注册的已知法术列表。
        - hatred (dict): 生物对周围生物的仇恨字典。
        - currentTarget (None): 生物当前的目标。
        - currentHatred (int): 生物当前的仇恨值。
        - previousSpeed (int): 生物之前的速度。
        - gazeTarget (None): 生物的凝视目标。
        - gazeCancelTaskId (None): 取消凝视的任务ID。
        - freezeTime (int): 生物被冰冻的时间。
        - gazeTaskId (None): 凝视的任务ID。
        - freezeUpdateTaskId (None): 更新冰冻的任务ID。
        - controlAiComp (None): 生物的控制AI组件。
        - blockingAI (bool): 生物AI是否正在阻塞的标志。
        - lookAtTaskId (None): 看向玩家的任务ID。
        - queueingSkills (list): 生物技能队列的列表。
        - healthRefillTask (None): 补满生命值的任务。
        - _healCounter (int): 治疗计数器。
    """

    def _lookAtNearestPlayer(self):
        # type: () -> None
        """
        看向最近的玩家。

        此方法查找生物位置最近的玩家并使生物朝向他。

        返回值：
            None
        """
        pass

    def recordDamage(self, attacker, amount, source, reason):
        # type: (str, int, str, str) -> None
        """
        记录受到的伤害。和仇恨无关。若要增加仇恨请用addHatred

        参数：
            - attacker (str): 攻击者的名称。
            - amount (int): 伤害的数量。
            - source (str): 伤害来源。
            - reason (str): 伤害的原因。

        返回值：
            None
        """
        pass

    def freeze(self, ticks, blockAI=None):
        # type: (int, None) -> None
        """
        冻结生物一段时间。冻结期间怪物不会移动、攻击、释放技能。但已经触发的技能不受影响

        参数：
            - ticks (int): 冻结的时间（以游戏刻为单位）。
            - blockAI (None): 阻止生物AI的标志。

        返回值：
            None
        """
        pass

    def triggerEvent(self, eventName):
        # type: (str) -> None
        """
        触发事件。

        参数：
            - eventName (str): 事件名称。

        返回值：
            None
        """
        pass

    def hasAnyMutation(self, tags):
        # type: (list) -> - False
        """
        检查是否存在任何一种突变。

        参数：
            - tags (list): 突变标签列表。

        返回值：
            - True: 存在突变。
            - False: 不存在突变。
        """
        return False


return False


    def getLevel(self):
        # type: () -> - int
        """
        获取等级。

        返回值：
            - int: 等级值。
        """
        return 0


    def refreshSpells(self):
        # type: () -> None
        """
        刷新技能。

        返回值：
            None
        """
        pass

    def reversePasteInstances(self):
        # type: () -> None
        """
        死亡时自动调用：恢复粘贴的结构，移除生成时放置的屏障方块并将其设置为空气。

        返回值：
            None
        """
        pass

    def onKill(self, victim):
        # type: () -> None
        """
        击杀事件。生物击杀其它生物后触发此事件

        参数：
            - victim: 被击杀的目标。

        返回值：
            None
        """
        pass

    def hurtBy(self, damager, amount, reason):
        # type: () -> None
        """
        受伤事件。生物受伤时触发此函数

        参数：
            - damager: 造成伤害的实体。
            - amount: 伤害数值。
            - reason: 伤害原因。

        返回值：
            None
        """
        pass

    def addHatred(self, damager, amount):
        # type: () -> None
        """
        增加仇恨值。

        参数：
            - damager: 伤害源实体。
            - amount: 伤害数值。

        返回值：
            None
        """
        pass

    def damages(self, victim):
        # type: () -> None
        """
        在对目标造成伤害时，触发此函数。

        参数：
            - victim: 受伤的目标。

        返回值：
            None
        """
        pass

    def gazeAt(self, target, ticks):
        # type: () -> None
        """
        注视目标一段时间。

        参数：
            - target: 目标实体。
            - ticks: 注视的时间（以游戏刻度为单位）。

        返回值：
            None
        """
        pass

    def addRide(self, rider):
        # type: () -> None
        """
        添加骑乘实体。

        参数：
            - rider: 骑乘实体。

        返回值：
            None
        """
        pass

    def getTarget(self):
        # type: () -> None
        """
        获取当前攻击目标。

        返回值：
            - 返回攻击目标实体。如果没有攻击目标，返回None。
        """
        pass

    def setTarget(self, target):
        # type: () -> None
        """
        设置攻击目标。

        参数：
            - target: 攻击目标实体。

        返回值：
            None
        """
        pass

